package rn;

import entidades.Setor;
import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import fabricas.DAOFabrica;
import interfaces.InterfaceSetorDAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import util.FacesUtil;
import entidades.LogEventos;

/**
 *
 * @author Marcelo Gomes Neto
 */
public class SetorRN {

    private InterfaceSetorDAO interfaceSetorDAO;

    public SetorRN() {
        this.interfaceSetorDAO = DAOFabrica.criarSetorDAO();
    }

    public Setor carregarSetor(Integer id) throws Exception {
        return this.interfaceSetorDAO.carregarSetor(id);
    }
    
    public void salvarSetor(Setor setor, Usuario usuario) throws DAOException, Exception
    {
        Integer id = setor.getIdunidade();
        String sigla = setor.getSiglaSetor().toUpperCase().trim();
        String desc = setor.getDescricaoSetor().toUpperCase().trim();
        Integer idusu = usuario.getIdusuario();
        Integer idUnidade = usuario.getPessoa().getUnidade();
        
        //VERIFICA SE EXISTE O SETOR
        List<Setor> resultado = this.interfaceSetorDAO.listarSetor();
        List<String> retornarDescricoes = new ArrayList<>();
        for (Setor st : resultado) {
            String descricao = st.getDescricaoSetor().toUpperCase();
            retornarDescricoes.add(descricao);
        }

        //VERIFICA SE EXISTE A SIGLA DO SETOR
        List<Setor> resultadoSigla = this.interfaceSetorDAO.listarSetor();
        List<String> retornarSigla = new ArrayList<>();
        for (Setor set : resultadoSigla) {
            String descricaoSigla = set.getSiglaSetor().toUpperCase();
            retornarSigla.add(descricaoSigla);
        }
        
        Date dataAtual = new Date(System.currentTimeMillis());
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        
        //Obtem a descrição da OM
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar unidade = unidadeMilitarRN.carregarUnidadeMilitar(idUnidade);
        String siglaOM = unidade.getSiglaOM();

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);
        
        if (id == null || id == 0)
        {
            if (retornarDescricoes.contains(desc)) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Setor " + desc + " já existe!", ""));
            }
            if (retornarSigla.contains(sigla)) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Setor " + sigla + " já existe!", ""));
            }
            if (!retornarDescricoes.contains(desc) && (!retornarSigla.contains(sigla)))
            {
                setor.setSiglaSetor(sigla);
                setor.setDescricaoSetor(desc); // seta a OM com todas as letras maiúsculas
                this.interfaceSetorDAO.salvarSetor(setor);
                logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") cadastrou o Setor "+setor.getSiglaSetor()+".");
                logEventosRN.salvarEvento(logEventos);
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado com sucesso!", ""));
            }
        }
        else
        {
            setor.setSiglaSetor(sigla);
            setor.setDescricaoSetor(desc);
            this.interfaceSetorDAO.alterarSetor(setor);
            
            logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") alterou os dados do Setor "+setor.getSiglaSetor()+".");
            logEventosRN.salvarEvento(logEventos);
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro alterado com sucesso!", ""));
        }
    }

    public void atualizarSetor(Setor setor) throws DAOException 
    {
        this.interfaceSetorDAO.alterarSetor(setor);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro alterado com sucesso!", ""));
    }
    
    public void excluirSetor(Setor setor, Usuario usuario) throws Exception 
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer IdUnidadeUsuario = usuario.getPessoa().getUnidade();
        //Obtem a descrição da OM
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar unidade = unidadeMilitarRN.carregarUnidadeMilitar(IdUnidadeUsuario);
        String siglaOM = unidade.getSiglaOM();

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(usuario.getIdusuario());
        logEventos.setDataEvento(dataAtual);
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        this.interfaceSetorDAO.excluirSetor(setor);
        
        logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") excluiu o Setor "+setor.getSiglaSetor()+".");
        logEventosRN.salvarEvento(logEventos);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro excluído com sucesso!", ""));
    }
    
    public List<Setor> listarSetor() {
        return this.interfaceSetorDAO.listarSetor();
    }
    
    public List<Setor> listarSetorDescricao() {
        return this.interfaceSetorDAO.listarSetorDescricao();
    }
    
    public List<Setor> listarSiglaSetor() {
        return this.interfaceSetorDAO.listarSiglaSetor();
    }
    
    public List<Setor> listarSetorPorOM(int idunidade) {
        return this.interfaceSetorDAO.listarSetorPorOM(idunidade);
    }
    
    public Setor carregaSetorPorOm(int idunidade, int idsetor) {
        return this.interfaceSetorDAO.carregaSetorPorOM(idunidade, idsetor);
    }
    
    /*
    public List<String> listarTipo() {
        return this.interfaceSetorDAO.listarTipo();
    }
    */
}